home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1999 March / EnigmA AMIGA RUN 35 (1999)(G.R. Edizioni)(IT)[!][issue 1999-03].iso / earcd / grafica / amicad / arexx / savenets.amicad < prev    next >
Text File  |  1999-01-01  |  11KB  |  423 lines

  1. /* Élaboration d'une netlist, appel simulateur analogique Spice
  2.    Version 1.00: 14-07-98
  3.    Version 1.01: 16-02-99 (modif ASKTEXT)
  4.    Version 1.02: 21/02/99 (modif REQFILE, ajout UNLOCK)
  5.    Version 1.03: 27/02/99 (ajout INIT variables)
  6.    Ne teste que les lignes horizontales ou verticales (pour les intersections)
  7.    $VER: SaveNets 1.02 (© R.Florac, 27/02/99) */
  8.  
  9. options results     /* indispensable pour récupérer le résultat des macros */
  10.  
  11. signal on error     /* pour l'interception des erreurs */
  12. signal on syntax
  13.  
  14. /* Test des liaisons */
  15. j=1; nets=1;
  16. 'DEF NEXTJUNCTION(O)=OO=O:WHILE(IF(OO>0,TYPE(OO)<>7,0),IF(OO<OBJECTS(-1),OO=OO+1,OO=0)):OO'
  17. 'INIT(O,OO,I,X,V0,V1,B):UNMARK(-1):LOCK(-1):OBJECTS(-1)'; objets=result
  18. /* Tableaux de données:
  19. equi: une donnée par élément, donne l'indice de l'équipotentielle à laquelle est liée une ligne
  20. label: une donnée par équipotentielle, donne son nom */
  21. equi.=-1
  22. label.=""
  23.  
  24. 'TITLE("Lecture des labels...")'
  25. do i=1 to objets
  26.     'TYPE(O='i')'
  27.     if result=4 | result=12 | result=11 then do
  28.     'ABS(FINDLINE(1,COL(O),LINE(O)))'; j=result
  29.     if j>0 then do
  30.         'READTEXT(O)'; label=result
  31.         if datatype(label,"w") then do      /* signale les labels numériques existants */
  32.         label.label="LABEL_DÉJÀ_UTILISÉ"
  33.         end
  34.     end
  35.     end
  36. end
  37.  
  38. 'TITLE("Analyse des liaisons...")'
  39. i=1
  40. do while i>0
  41.     'OO=FINDOBJ('i',2,-1,-1)'; i=result
  42.     if result>0 then do
  43.     'TEST(OO)'
  44.     if result=0 then do
  45.         do while label.nets~=""
  46.         nets=nets+1
  47.         end
  48.         label.nets=nets
  49.         equi.i=nets
  50.         'COORDS(OO)'            /* Marquage du fil */
  51.         parse var result x0','y0','x1','y1
  52.         call test_ligne(x0,y0,nets,objets)
  53.         call test_ligne(x1,y1,nets,objets)
  54.     end
  55.     if i=objets then i=0
  56.     else i=i+1
  57.     end
  58. end
  59.  
  60. 'TITLE("Analyse des jonctions...")'
  61. i=1
  62. do while i>0
  63.     'I=FINDOBJ('i',7,-1,-1)'; i=result
  64.     if i>0 then do
  65.     'MARK(I):L1=ABS(FINDLINE(1,COL(I),LINE(I)))'; l1=result
  66.     if l1>0 & l1<objets then do
  67.         j=l1+1
  68.         do while j>0
  69.         'J=ABS(FINDLINE('j',COL(I),LINE(I)))'; j=result
  70.         if j>0 then do
  71.             if equi.j~=equi.l1 then do
  72.             call changer_labels(l1,j)
  73.             end
  74.             if j=objets then j=0
  75.             else j=j+1
  76.         end
  77.         end
  78.     end
  79.     if i=objets then i=0
  80.     else i=i+1
  81.     end
  82. end
  83.  
  84. 'TITLE("Recherche des labels et des connecteurs...")'
  85. do i=1 to objets
  86.     'TYPE(O='i')'
  87.     if result=4 | result=12 | result=11 then do
  88.     'ABS(FINDLINE(1,COL(O),LINE(O)))'; j=result
  89.     if j>0 then do
  90.         net=equi.j
  91.         'READTEXT(O)'; label=result
  92.         label.net=label
  93.     end
  94.     end
  95. end
  96.  
  97. 'TITLE("Recherche des alimentations...")'
  98. do i=1 to objets
  99.     'FINDPART('i',"ALIMENTATION")'; i=result
  100.     if i>0 then do
  101.     j=connexion_broche(i,1)
  102.     if j>0 then do
  103.         net=equi.j
  104.         'READTEXT(GETVAL('i'))'; label=result
  105.         label.net=label
  106.     end
  107.     end
  108.     else leave
  109. end
  110.  
  111. 'TITLE("Test redondances...")'
  112. do i=1 to nets
  113.     do j=i+1 to nets
  114.     if label.j~="" then do
  115.         if label.i=label.j then do
  116.         do k=1 to objets
  117.             if equi.k=j then equi.k=i
  118.         end
  119.         label.j=""
  120.         end
  121.     end
  122.     end
  123. end
  124.  
  125. 'TITLE("Recherche des masses...")'
  126. do i=1 to objets
  127.     'FINDPART('i',"MASSE")'; i=result
  128.     if i>0 then do
  129.     j=connexion_broche(i,1)
  130.     if j>0 then do
  131.         equi.0=0; label.0=0
  132.         call changer_labels(0,j)
  133.     end
  134.     end
  135.     else leave
  136. end
  137.  
  138. do until c=0
  139.     'TITLE("Établissement équipotentielles terminé"):SELECT("Choisissez une action"+CHR(10)+"Visualiser les équipotentielles"+CHR(10)+"Contrôler la netlist"+CHR(10)+"Sauver la netlist"+CHR(10)+"Abandonner ce script")'
  140.     select
  141.     when result=1 then call visu_equi
  142.     when result=2 then call controler_netlist
  143.     when result=3 then call sauver_netlist
  144.     otherwise c=0
  145.     end
  146. end
  147. 'UNLOCK(-1):INIT(O,OO,I,X,V0,V1,B)'
  148. exit
  149.  
  150. visu_equi:
  151.     'TITLE("Vérification équipotentielles"):UNMARK(-1)'
  152.     do i=0 to nets
  153.     if label.i ~= "LABEL_DÉJÀ_UTILISÉ" & label.i ~= "" then do
  154.         do j=1 to objets
  155.         if equi.j=i then 'MARK('j')'
  156.         end
  157.         'SELECT("Équipotentielle 'label.i'"+CHR(10)+"Abandonner"+CHR(10)+"Continuer"+CHR(10)+"Sauver netlist"+CHR(10)+"Contrôler netlist")'
  158.         if result <= 1 then return
  159.         if result = 3 then do
  160.         call sauver_netlist
  161.         'UNLOCK(-1):INIT(O,OO,I,X,V0,V1,B)'
  162.         exit
  163.         end
  164.         if result = 4 then do
  165.         call controler_netlist
  166.         leave
  167.         end
  168.         'UNMARK(-1)'
  169.     end
  170.     end
  171.     return
  172.  
  173. test_ligne: procedure expose equi.
  174.     parse arg x0,y0,n,nbo
  175.     o=1
  176.     do until o=0
  177.     'X=FINDOBJ('o',2,'x0','y0')'; o=result
  178.     if o>0 then do
  179.         'IF(TEST(X),"",MARK(X):COORDS(X))'
  180.         if result~="" then do
  181.         parse var result x1','y1','x2','y2
  182.         equi.o=n
  183.         if x0=x1 & y0=y1 then call test_ligne(x2,y2,n,nbo)
  184.         else call test_ligne(x1,y1,n,nbo)
  185.         end
  186.         if o=nbo then o=0
  187.         else o=o+1
  188.     end
  189.     end
  190.     return
  191.  
  192. changer_labels: procedure expose equi. objets label.
  193.     parse arg o1,o2
  194.     if datatype(equi.o2,'w') then do
  195.     e=equi.o2
  196.     label.e=""
  197.     do i=1 to objets
  198.         if equi.i=e then equi.i=equi.o1
  199.     end
  200.     return o1
  201.     end
  202.     else do
  203.     e=equi.o1
  204.     label.e=""
  205.     do i=1 to objets
  206.         if equi.i=e then equi.i=equi.o2
  207.     end
  208.     return o2
  209.     end
  210.     return
  211.  
  212. test_jonction: procedure expose equi.
  213.     parse arg xj,yj,n,objets
  214.     obj=1
  215.     do while obj>0
  216.     'X=ABS(FINDLINE('obj','xj','yj'))'; obj=result
  217.     if obj>0 then do
  218.         if equi.obj=n then return 1
  219.         if obj=objets then return 0
  220.         obj=obj+1
  221.     end
  222.     end
  223.     return 0
  224.  
  225. controler_netlist:
  226.     'TITLE("Contrôle netlist...")'
  227.     i=1
  228.     do while i>0
  229.     'O=FINDOBJ('i',1,-1,-1)'; i=result
  230.     if i>0 then do
  231.         'PARTNAME(O)'
  232.         if result~="ALIMENTATION" & result ~="MASSE" then do
  233.         'IF(GETREF(O),READTEXT(GETREF(O)),PARTNAME(O)+"?")'
  234.         ligne=translate(result,"_"," ")||' '
  235.         'DEVPINS(O)'; j=result
  236.         do k=1 to j
  237.             l=connexion_broche(i,k)
  238.             if l>0 then do
  239.             net=equi.l
  240.             ligne=ligne||label.net||' '
  241.             end
  242.             else ligne=ligne||"-1"||' '
  243.         end
  244.         'IF(GETVAL(O),READTEXT(GETVAL(O)),PARTNAME(O))'
  245.         ligne=ligne||result
  246.         'UNMARK(-1):MARK(O):SELECT("'ligne'"+CHR(10)+"Continuer"+CHR(10)+"Abandonner")'
  247.         if result~=1 then return
  248.         end
  249.         if i=objets then leave
  250.         i=i+1
  251.     end
  252.     end
  253.     'TITLE("")'
  254. return
  255.  
  256. sauver_netlist:
  257.     'TITLE(""):REQFILE("Fichier netlist à créer","Spice",FILEPART("")+".cir")'
  258.     fichier=result
  259.     if fichier="" then return
  260.     'TITLE("Sauvegarde netlist...")'
  261.     if ~open(file, fichier, 'W') then return
  262.     'FILEPART("")'
  263.     writeln(file,result)
  264.     'DATE(1)+" à "+TIME(1)'
  265.     writeln(file,"* Créé par AmiCAD, le "||result||" *")
  266.     writeln(file,".include Travail:Spice3f5/lib/modeles.cir")
  267.     do i=1 to objets
  268.     'O=FINDOBJ('i',1,-1,-1)'; i=result
  269.     if result>0 then do
  270.         'PARTNAME(O)'
  271.         if result~="ALIMENTATION" & result ~="MASSE" then do
  272.         'IF(GETREF(O),READTEXT(GETREF(O)),PARTNAME(O)+"?")'
  273.         ligne=translate(result,"_"," ")||' '
  274.         'DEVPINS(O)'; j=result
  275.         do k=1 to j
  276.             l=connexion_broche(i,k)
  277.             if l>0 then do
  278.             net=equi.l
  279.             ligne=ligne||label.net||' '
  280.             end
  281.             else ligne=ligne||"-1"||' '
  282.         end
  283.         'IF(GETVAL(O),READTEXT(GETVAL(O)),PARTNAME(O))'
  284.         ligne=ligne||result
  285.         call writeln(file, ligne)
  286.         end
  287.     end
  288.     else leave i
  289.     end
  290.     analyse=""
  291.     do i=1 to objets
  292.     'FINDOBJ('i',4,-1,-1)'; i=result
  293.     if i>0 then do
  294.         'READTEXT('i')'; t=result
  295.         if left(t,10)=".ANALYSE: " then do
  296.         analyse=substr(t,11)
  297.         end
  298.     end
  299.     else leave
  300.     end
  301.     if analyse="" then do
  302.     'SELECT("Type d''analyse à effectuer"+CHR(10)+"AC"+CHR(10)+"DC"+CHR(10)+"Transient")'
  303.     select
  304.         when result=1 then do
  305.         'SELECT("Type de variation"+CHR(10)+"Décade"+CHR(10)+"Octave"+CHR(10)+"Linéaire")'
  306.         select
  307.             when result=1 then do
  308.             f="DEC "; v="par décade"
  309.             end
  310.             when result=2 then do
  311.             f="OCT "; v="par octave"
  312.             end
  313.             when result=3 then do
  314.             f="LIN "; v="de test"
  315.             end
  316.             otherwise do
  317.             close(file)
  318.             return
  319.             end
  320.         end
  321.         'ASKNUM("Nombre de points 'v'?",100)'
  322.         f=f||result
  323.         'ASKTEXT("Quelle est la fréquence de début?","10")'
  324.         f=f||" "||result
  325.         'ASKTEXT("Quelle est la fréquence de fin?","100")'
  326.         analyse="AC "||f||' '||result
  327.         end
  328.         when result=2 then do
  329.         'UNMARK(-1):MESSAGE("Vous devez maintenant"+CHR(10)+"sélectionner une source")'
  330.         'PICKOBJ("Sélectionnez le générateur à faire varier.")'
  331.         f=result
  332.         if f<1 then return
  333.         'MARK('f'):TYPE('f')'
  334.         if result=5 then 'READTEXT('f')'
  335.         else 'READTEXT(GETREF('f'))'
  336.         f=result
  337.         'V0=ASKTEXT("Quelle est la valeur de départ?","V")'
  338.         f=f||' '||result
  339.         'V1=ASKTEXT("Quelle est la valeur finale.","V")'
  340.         f=f||' '||result
  341.         'ASKTEXT("Quel est l''incrément?",STR((VAL(V1)-VAL(V0))/100)+"V")'
  342.         analyse="DC "||f||' '||result
  343.         end
  344.         when result=3 then do
  345.         'ASKTEXT("Temps de simulation?","s")'; temps=result
  346.         'ASKTEXT("Pas de simulation?","s")'; pas=result
  347.         'ASKTEXT("Temps de début de la simulation?","s")'; d=result
  348.         analyse="tran "||pas||" "||temps||" "||d
  349.         end
  350.         otherwise
  351.         return
  352.     end
  353.     end
  354.     if analyse~="" then writeln(file,"."||analyse)
  355.     i=1
  356.     s=''
  357.     'UNMARK(-1):MESSAGE("Vous pouvez maintenant"+CHR(10)+"spécifier quels sont les"+CHR(10)+"signaux à visualiser"+CHR(10)+"Appuyez sur le bouton"+CHR(10)+"droit pour arrêter")'
  358.     do while i>0
  359.     'PICKOBJ("Sélectionnez un signal (label ou liaison)")'
  360.     i=result
  361.     if i>0 then do
  362.         'MARK('i'):TYPE('i')'; t=result
  363.         if t=2 then do
  364.         lab=equi.i
  365.         lab=label.lab
  366.         end
  367.         else do
  368.         'READTEXT('i')'
  369.         lab=result
  370.         end
  371.         if i>0 then s=s||' '||'V('||lab||')'
  372.     end
  373.     end
  374.     if s~='' then writeln(file,".save"||s)
  375.     writeln(file,".END")
  376.     close(file)
  377.     'TITLE(""):REQUEST("Sauvegarde terminée"+CHR(10)+"Voulez-vous effectuer"+CHR(10)+"la simulation?")'
  378.     if result=1 then do
  379.     'SELFILE("Tracé "+FILEPART(""))'
  380.     ft=result
  381.     if ft<0 then do
  382.         'NEW("Tracé "+FILEPART(""))'
  383.         if result=0 then do
  384.         'MESSAGE("Ouverture fenêtre tracé imposible")'
  385.         return
  386.         end
  387.         'SELSHEET(-1)'; ft=result
  388.     end
  389.     call 'Travail:AmiCAD/ARexx/Simulation.AmiCAD' fichier
  390.     call 'Travail:AmiCAD/ARexx/TracerSpice.AmiCAD' 'RAM:'||ParseFileName(fichier)||'_spice'
  391.     end
  392. return
  393.  
  394. connexion_broche: procedure
  395.     parse arg objet,broche
  396.     'PINCOL(O='objet',B='broche')'; xj=result
  397.     'PINLINE(O,B)'; yj=result
  398.     'FINDOBJ(1,2,'xj','yj')'; xl=result     /* Il y a t'il une ligne qui part de la broche? */
  399.     if xl>0 then return xl
  400.     'FINDLINE(1,'xj','yj')'; xl=result      /* Il y a peut être une ligne qui passe sur la broche... */
  401.     if xl<=0 then return 0
  402.     'FINDOBJ(1,7,'xj','yj')'                /* Il doit alors y avoir une jonction */
  403.     if result>0 then return xl
  404.     return 0
  405.  
  406. ParseFileName: procedure
  407.     parse arg FilePath, Part
  408.     DivPos = max(lastpos(':',FilePath),lastpos('/',FilePath))+1
  409.     if abbrev('FILE', upper(Part))
  410.     then return substr(FilePath, DivPos)
  411.     else
  412.     return strip(left(FilePath, DivPos-1),'T','/')
  413.  
  414. /* Traitement des erreurs, interruption du programme */
  415. syntax:
  416. erreur=RC
  417. 'MESSAGE("Script SaveNets.AmiCAD"+CHR(10)+"Erreur de syntaxe"+CHR(10)+"en ligne 'SIGL'"+CHR(10)+"'errortext(erreur)'"):UNLOCK(-1):INIT(O,OO,I,X,V0,V1,B)'
  418. exit
  419.  
  420. error:
  421. 'MESSAGE("Script SaveNets.AmiCAD"+CHR(10)+"Erreur en ligne 'SIGL'"):UNLOCK(-1):INIT(O,OO,I,X,V0,V1,B)'
  422. exit
  423.